package com.naotebuk.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.naotebuk.entity.Cliente;
import com.naotebuk.entity.Conserto;
import com.naotebuk.enums.StatusConserto;
import com.naotebuk.vo.FiltroConsertoVO;

public class ConsertoDAO {

	public static boolean save(Conserto conserto) {
		try {
			if (conserto.getIdConserto() == 0)
				return insert(conserto);
			return update(conserto);
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public static boolean insert(Conserto conserto) throws SQLException {
		String sql = " INSERT INTO CONSERTO (" +
				" idCliente," +
				" tipoEquipamento, " +
				" modelo, " +
				" fabricante, " +
				" descricao, " +
				" dataEntrada, " +
				" dataPrevisaoEntrega, " +
				" valorOrcado, " +
				" dataRetirada, " +
				" dataPagamento," +
				" valorPagamento," +
				" formaPagamento ) " +
				" VALUES (?,?,?,?,?,?,?,?,?,?,?,?) ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					conserto.getCliente().getIdCliente(),
					conserto.getTipoEquipamento(),
					conserto.getModelo(),
					conserto.getFabricante(),
					conserto.getDescricao(),
					conserto.getDataEntrada(),
					conserto.getDataPrevisaoEntrega(),
					conserto.getValorOrcado(),
					conserto.getDataRetirada(),
					conserto.getDataPagamento(),
					conserto.getValorPagamento(),
					conserto.getFormaPagamento()
			);
			return true;
		} catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		finally {
			conn.close();
		}
	}
	
	private static boolean update(Conserto conserto) throws SQLException {
		String sql = " UPDATE CONSERTO SET " +
				" idCliente = ?," +
				" tipoEquipamento = ?, " +
				" modelo = ?, " +
				" fabricante = ?, " +
				" descricao = ?, " +
				" dataEntrada = ?, " +
				" dataPrevisaoEntrega = ?, " +
				" valorOrcado = ?, " +
				" dataConclusao = ?, " +
				" dataRetirada = ?, " +
				" dataPagamento = ?," +
				" valorPagamento = ?," +
				" formaPagamento = ?, " +
				" observacoes = ? " +
				" WHERE idConserto = ? ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					conserto.getIdCliente(),
					conserto.getTipoEquipamento(),
					conserto.getModelo(),
					conserto.getFabricante(),
					conserto.getDescricao(),
					conserto.getDataEntrada(),
					conserto.getDataPrevisaoEntrega(),
					conserto.getValorOrcado(),
					conserto.getDataConclusao(),
					conserto.getDataRetirada(),
					conserto.getDataPagamento(),
					conserto.getValorPagamento(),
					conserto.getFormaPagamento(),
					conserto.getObservacoes(),
					conserto.getIdConserto()
			);
			return true;
		} catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		finally {
			conn.close();
		}
		
	}
	public static boolean delete(Conserto conserto) throws SQLException {
		String sql = " DELETE FROM CONSERTO " +
					" WHERE IDCONSERTO = ? ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					conserto.getIdConserto()
			);
			return true;
		} finally {
			conn.close();
		}
	}
	
	public static List<Conserto> getConsertos(FiltroConsertoVO filtro) {
		ArrayList<Object> params = new ArrayList<Object>();
		String sql = " SELECT C.* " + 
			 	 	 " FROM CONSERTO C " +
			 	 	 " JOIN CLIENTE CL ON (C.IDCLIENTE = CL.IDCLIENTE)" +
			 	 	 " WHERE 1 = 1 ";
		
		// cpf
		if (filtro.getCpf() != null && !"".equals(filtro.getCpf())) {
			sql += " AND CL.CPF = " + filtro.getCpfUnformated();
		}
		
		// nome do cliente
		if (filtro.getNomeCliente() != null && !"".equals(filtro.getNomeCliente())) {
			sql += " AND CL.NOME LIKE '%" + filtro.getNomeCliente() + "%'";
		}
		
		// status
		if (filtro.getStatus() != StatusConserto.TODOS.codigo) {
			if (filtro.getStatus() == StatusConserto.EM_ABERTO.codigo) {
				sql += " AND C.DATACONCLUSAO IS NULL ";
			} else if (filtro.getStatus() == StatusConserto.A_SER_RETIRADO.codigo) {
				sql += " AND C.DATACONCLUSAO IS NOT NULL ";
				sql += " AND C.DATARETIRADA IS NULL ";
			} else if (filtro.getStatus() == StatusConserto.EM_ATRASO.codigo) {
				sql += " AND C.DATACONCLUSAO IS NULL ";
				sql += " AND C.DATAPREVISAOENTREGA < CURRENT_DATE()"  ;
			}
		}
		
		// data entrada
		if (filtro.getDataEntradaInicio() != null) {
			sql += " AND C.DATAENTRADA >= ? ";
			params.add(filtro.getDataEntradaInicio());
		}
		if (filtro.getDataEntradaFim() != null) {
			sql += " AND C.DATAENTRADA <= ? ";
			params.add(filtro.getDataEntradaFim());
		}
		
		// data entrada
		if (filtro.getDataConclusaoInicio() != null) {
			sql += " AND C.DATACONCLUSAO >= ? ";
			params.add(filtro.getDataConclusaoInicio());
		}
		if (filtro.getDataConclusaoFim() != null) {
			sql += " AND C.DATACONCLUSAO <= ? ";
			params.add(filtro.getDataConclusaoFim());
		}
		
		// define um filtro padrão
		if (params.size() == 0) {
			sql += " AND C.IDCONSERTO >= ? ";
			params.add(0);
		}
		
		// ordenação
		if (filtro.getStatus() == StatusConserto.EM_ATRASO.codigo) {
			sql += " ORDER BY C.DATAPREVISAOENTREGA DESC ";
		} else
			sql += " ORDER BY C.IDCONSERTO DESC ";

		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			ResultSetHandler<List<Conserto>> h = new BeanListHandler<Conserto>(Conserto.class);
			return run.query(conn, sql, h, params.toArray()); 
		} catch (Exception e) {
			e.printStackTrace();
		} 
		finally {
			try {
				conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return null;
	}

	public static boolean existeConserto(Cliente clienteSelecionado) throws SQLException {
		String sql = " SELECT C.* " +
					 " FROM CONSERTO C " +
					 " INNER JOIN CLIENTE CL ON (C.IDCLIENTE = CL.IDCLIENTE)" +
					 " WHERE C.IDCLIENTE = " + clienteSelecionado.getIdCliente() + 
					 " LIMIT 1";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			ResultSetHandler<Conserto> h = new BeanHandler<Conserto>(Conserto.class);
			Conserto c = (Conserto) run.query(conn, sql, h);
			return c != null;
		} finally {
			conn.close();
		}
	}

}
